Python 3des 加密

对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。 基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

安装 pyDes 包

1
pip install pyDes

简单示例

1
2
3
4
5
6
7
import pyDes
import base64

data = "Please encrypt my data"
k = pyDes.des("DESCRYPT", pyDes.CBC, "00000000", pad=None, padmode=pyDes.PAD_PKCS5)
d = k.encrypt(data)
print(str(base64.b64encode(d), encoding="utf-8"))

可以在网上在线示例进行简单的校验

封装工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import pyDes
import base64


class TripleDesUtils:
des_mode = {"CBC": pyDes.CBC, "ECB": pyDes.ECB}
des_pad_mode = {"PAD_PKCS5": pyDes.PAD_PKCS5, "PAD_NORMAL": pyDes.PAD_NORMAL}

def __init__(self, mode, pad_mode, key, iv, pad=None, trans_base64=False):
"""
:param mode: des 加密模式,目前支持 CBC,ECB
:param pad_mode: 目前支持 PAD_PKCS5,PAD_NORMAL
:param trans_base64: 加密结果是否以 base64 格式输出
:param key: 密钥
:param iv: 偏移量
:param pad:
"""
self.trans_base64 = trans_base64
self.k = pyDes.des(key, TripleDesUtils.des_mode.get(mode), iv, pad, TripleDesUtils.des_pad_mode.get(pad_mode))

def encryption(self, data: str) -> str:
"""
3des 加密
说明: 3DES数据块长度为64位,所以IV长度需要为8个字符(ECB模式不用IV),密钥长度为16或24个字符(8个字符以内则结果与DES相同
IV与密钥超过长度则截取,不足则在末尾填充'\0'补足
:param data: 待加密数据
:return:
"""
_encryption_result = self.k.encrypt(data)
if self.trans_base64:
_encryption_result = self._base64encode(_encryption_result)
return _encryption_result

def decrypt(self, data: str) -> str:
"""
3des 解密
:param data: 待解密数据
:return:
"""
if self.trans_base64:
data = self._base64decode(data)
_decrypt_result = self.k.decrypt(data)
return _decrypt_result

@staticmethod
def _base64encode(data):
"""
base 64 encode
:param data: encode data
:return:
"""
try:
_b64encode_result = base64.b64encode(data)
except Exception as e:
raise Exception(f"base64 encode error:{e}")
return _b64encode_result

@staticmethod
def _base64decode(data):
"""
base 64 decode
:param data: decode data
:return:
"""
try:
_b64decode_result = base64.b64decode(data)
except Exception as e:
raise Exception(f"base64 decode error:{e}")
return _b64decode_result


if __name__ == "__main__":
test_data = "test_c"
DesObj = TripleDesUtils(mode="CBC", pad_mode="PAD_PKCS5", key="DESCRYPT", iv="00000000", trans_base64=True)
result = DesObj.encryption(test_data)
print(f"加密结果: {result}")

result2 = DesObj.decrypt(result)
print(f"解密结果: {result2}")